﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet.Tasks
{
	/// <summary>
	/// 提供回呼 (Callback) 功能的 Task。
	/// </summary>
	public class CallbackTask : Task
	{
		#region 欄位
		object[] _Arguments;
		string _Message;
		Delegate _Method;
		object _ReturnValue;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 CallbackTask 執行個體。
		/// </summary>
		/// <param name="method">提供回呼的方法。</param>
		/// <param name="args">回呼方法的參數。</param>
		/// <exception cref="ArgumentNullException">method 為 Null (Visual Basic 為 Nothing)。</exception>
		public CallbackTask(Delegate method, params object[] args)
		{
			//確認
			if (method == null)
				throw new ArgumentNullException("method");

			//初始化
			_Method = method;
			_Arguments = args;
		}
		#endregion
		#region Execute
		protected override bool Execute(TaskVersion version)
		{
			string message = _Message;
			if (message != null)
				this.CreateMessage(version, TaskMessageType.Information, message);
			_ReturnValue = _Method.DynamicInvoke(_Arguments);
			return true;
		}
		#endregion
		#region Message
		/// <summary>
		/// 取得執行工作時的初始訊息文字。
		/// </summary>
		public string Message
		{
			get
			{
				return _Message;
			}
			set
			{
				this.SetInitializingParameter<string>(ref _Message, value);
			}
		}
		#endregion
		#region ResetOverride
		protected override void ResetOverride()
		{
			//呼叫基底
			base.ResetOverride();

			//重設參數
			_ReturnValue = null;
		}
		#endregion
		#region ReturnValue
		/// <summary>
		/// 取得回呼函式的回傳值。
		/// </summary>
		public object ReturnValue
		{
			get
			{
				return _ReturnValue;
			}
		}
		#endregion
	}
}
